package com.sql.connection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * @Auther: zch
 * @Date: 2019/6/26 14:40
 * @Description:  连接池 行为：初始化连接池，所需数据，数据库的配置信息，所以要有个属性来接收数据库配置信息。
 */
public abstract class ConnectionPool {
    private DataSourceConfig dataSourceConfig;
    protected LinkedBlockingDeque<SqlConnection> connectionContext; //连接池容器，用来存放连接。
    public abstract  SqlConnection getConnection();

    //初始化连接。
    protected void init(DataSourceConfig dataSourceConfig){
     this.dataSourceConfig=dataSourceConfig;
     //加载驱动
        try{
            Class.forName(dataSourceConfig.getJdbcDriver());
        }catch (Exception e){
            e.printStackTrace();
        }
        createPoolConnection(dataSourceConfig.getInitCount());
    }

    //向连接池里塞入连接。
    private void createPoolConnection(int count){
       if(connectionContext==null){
           connectionContext=new LinkedBlockingDeque<>();
       }
       for(int i=0;i<count;i++){
           try{
               Connection connection= DriverManager.getConnection(dataSourceConfig.getJdbcUrl(),dataSourceConfig.getJdbcUserName(),dataSourceConfig.getJdbcPassword());
               SqlConnection sqlConnection=new SqlConnection(true,connection);
               connectionContext.add(sqlConnection);
           }catch (Exception e){
               e.printStackTrace();
           }
       }
    }
}
